0190. 颠倒二进制位【简单】
1. 📝 题目描述
颠倒给定的 32 位无符号整数的二进制位。
示例 1:
txt
输入:n = 43261596
输出:964176192
解释:1
2
3
2
3
| 整数 | 二进制 |
|---|---|
| 43261596 | 00000010100101000001111010011100 |
| 964176192 | 00111001011110000010100101000000 |
示例 2:
txt
输入:n = 2147483644
输出:1073741822
解释:1
2
3
2
3
| 整数 | 二进制 |
|---|---|
| 2147483644 | 01111111111111111111111111111100 |
| 1073741822 | 00111111111111111111111111111110 |
提示:
0 <= n <= 2^31 - 2n为偶数
进阶: 如果多次调用这个函数,你将如何优化你的算法?
2. 🎯 s.1 - 暴力解法
js
/**
* @param {number} n
* @return {number}
*/
var reverseBits = function (n) {
let result = 0
for (let i = 0; i < 32; i++) {
// 将结果左移一位,为新位腾出空间
result <<= 1
// 取 n 的最低位,将其放到 result 的最低位
result |= n & 1
// 将 n 右移一位,准备处理下一位
n >>= 1
}
// 由于 JS 中所有数字都是有符号 32 位整数,
// 需要将其转换为无符号 32 位整数
return result >>> 0
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 时间复杂度:
,因为循环固定执行 32 次,与输入值无关。 - 空间复杂度:
,只使用了常数级别的额外空间来存储 result 和循环变量。 - 注解:
return result >>> 0>>>是 JS 中的无符号右移操作符。当我们对一个数执行>>> 0操作时:- 将该数转换为 32 位无符号整数
- 由于右移 0 位,数值本身不变
- 但结果被解释为无符号整数
- 如果我们不使用
>>> 0,JS 可能会将结果解释为负数,导致返回错误的值。